//备注：拷贝代码请加上作者信息
//作者：王海涛
//邮箱：1126471088@qq.com
//版本：V1.0.0
#ifndef __PID_Q15_H__
#define __PID_Q15_H__

#include <stdbool.h>

/* Q15格式定义：1位符号位 + 15位小数位，数值范围[-1.0, 1.0] */
typedef short Q15_t;

/* PID控制器结构体（Q15格式） */
typedef struct
{
    Q15_t kp;                // 比例系数（动态调整）
    Q15_t ki;                // 积分系数（动态调整）
    Q15_t kd;                // 微分系数（动态调整）
    
    Q15_t Setpoint;          // 设定值
    Q15_t Feedback;          // 反馈值
    Q15_t Error;             // 当前误差
    Q15_t Error_Prev;        // 上一次误差
    Q15_t Error_Sum;         // 误差积分累计
    
    Q15_t Output_Min;        // 输出最小值
    Q15_t Output_Max;        // 输出最大值
    
    bool Integral_Limit_En;  // 积分限幅使能
    Q15_t Integral_Min;      // 积分最小值
    Q15_t Integral_Max;      // 积分最大值
    
    bool Derivative_Filter_En;  // 微分滤波使能
    Q15_t Derivative_Alpha;     // 微分滤波系数（0~1，越大响应越快）
    Q15_t Derivative_Filtered;  // 滤波后的微分值

    /********************* 新增：自适应相关参数 *********************/
    bool Adaptive_En;         // 自适应调参使能开关
    Q15_t kp_max;             // kp最大值
    Q15_t kp_min;             // kp最小值
    Q15_t ki_max;             // ki最大值
    Q15_t ki_min;             // ki最小值
    Q15_t kd_max;             // kd最大值
    Q15_t kd_min;             // kd最小值
    // 自适应误差阈值（Q15格式，可根据实际场景调整）
    Q15_t Adaptive_Err_Large; // 误差"大"的阈值（例：0x1000 = ~0.125）
    Q15_t Adaptive_Err_Med;   // 误差"中"的阈值（例：0x0800 = ~0.0625）
    Q15_t Adaptive_Diff_Small;// 误差变化率"小"的阈值（例：0x0400 = ~0.03125）
}WHT_PID_Q15_Ctrl_t;


/* PID处理函数 */
typedef struct
{
    /**
     * @brief  PID初始化函数
     * @param  pid: PID句柄指针
     * @param  kp: 比例系数
     * @param  ki: 积分系数
     * @param  kd: 微分系数
     * @param  output_min: 输出最小值
     * @param  output_max: 输出最大值
     */
    void (*WHT_Init)(WHT_PID_Q15_Ctrl_t *pid, Q15_t kp, Q15_t ki, Q15_t kd, Q15_t output_min, Q15_t output_max);
    
    /**
     * @brief  重置PID状态（误差、积分、微分等）
     * @param  pid: PID句柄指针
     */
    void (*WHT_Reset)(WHT_PID_Q15_Ctrl_t *pid);
    
    /**
     * @brief  配置积分限幅
     * @param  pid: PID句柄指针
     * @param  enable: 使能标志
     * @param  integral_min: 积分最小值
     * @param  integral_max: 积分最大值
     */
    void (*WHT_Config_Integral_Limit)(WHT_PID_Q15_Ctrl_t *pid, bool enable, Q15_t integral_min, Q15_t integral_max);
    
    /**
     * @brief  配置微分滤波（一阶低通滤波）
     * @param  pid: PID句柄指针
     * @param  enable: 使能标志
     * @param  alpha: 滤波系数（建议0.8~0.95）
     */
    void (*WHT_Config_Derivative_Filter)(WHT_PID_Q15_Ctrl_t *pid, bool enable, Q15_t alpha);
    
    /**
     * @brief  设置PID设定值
     * @param  pid: PID句柄指针
     * @param  setpoint: 设定值
     */
    void (*WHT_Set_Setpoint)(WHT_PID_Q15_Ctrl_t *pid, Q15_t setpoint);
    
    /**
     * @brief  PID计算核心函数
     * @param  pid: PID句柄指针
     * @param  feedback: 当前反馈值
     * @return Q15_t: PID输出值
     */
    Q15_t (*WHT_Compute)(WHT_PID_Q15_Ctrl_t *pid, Q15_t feedback);
    
    /**
     * @brief  十进制转Q15格式（辅助函数）
     * @param  val: 十进制浮点数（范围[-1.0, 1.0]）
     * @return Q15_t: Q15格式数值
     */
    Q15_t (*WHT_Float_To_Q15)(float val);
    
    /**
     * @brief  Q15格式转十进制（辅助函数）
     * @param  q: Q15格式数值
     * @return float: 十进制浮点数
     */
    float (*WHT_Q15_To_Float)(Q15_t q);

    /**
     * @brief  配置自适应调参（核心）
     * @param  pid: PID句柄指针
     * @param  enable: 自适应使能（true=启用）
     * @param  kp_min/max: kp范围
     * @param  ki_min/max: ki范围
     * @param  kd_min/max: kd范围
     * @param  err_large: 误差"大"阈值（例：0.125→0x1000）
     * @param  err_med: 误差"中"阈值（例：0.0625→0x0800）
     * @param  diff_small: 误差变化率"小"阈值（例：0.03125→0x0400）
     */
    void (*WHT_Config_Adaptive)(WHT_PID_Q15_Ctrl_t *pid, bool enable, Q15_t kp_min, Q15_t kp_max, Q15_t ki_min, Q15_t ki_max, Q15_t kd_min, Q15_t kd_max, Q15_t err_large, Q15_t err_med, Q15_t diff_small);
}WHT_PID_Q15_t;

const WHT_PID_Q15_t WHT_PID_Q15;

#endif // __PID_Q15_H__
